package project;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;


public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<User> list = new ArrayList<>();
        pool:
        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作:\t1 登录\t2 注册\t3 忘记密码\t4 退出");
            String choose = sc.next();
            switch (choose) {
                case "1":
                    login(list);

                    break;
                case "2":
                    register(list);
                    break;
                case "3":
                    forgetPassword(list);
                    break;
                case "4":
                    System.out.println("退出");
                    break pool;
                case "5":
                    System.out.println(list);
                default:
                    System.out.println("没有这个选项");
            }
        }
    }

    //登录
    public static void login(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的用户名:");
        String username = sc.next();
        //用户名如果未注册，直接结束方法，并提示：用户名未注册，请先注册
        if (!(contains(list, username))) {
            System.out.println("用户名未注册，请先注册");
        } else {
            System.out.println("请输入您的密码:");
            String passWord = sc.next();
            while (true) {
                //获取验证码
                String code = getCode();
                System.out.println("您的验证码为:" + code + "\n请输入验证码:");
                String userCode = sc.next();
                //判断时忽视大小写
                if (!(code.equalsIgnoreCase(userCode))) {
                    System.out.println("验证码错误,请重新输入:");
                }else {
                    System.out.println("验证码正确!");
                    break;
                }
            }

            //判断用户名和密码是否正确
            User userInfo = new User(username,passWord,null,null);
            boolean result = checkUserInfo(list,userInfo);
            if (!result){
                System.out.println("登录失败，用户名或密码错误!");
                System.out.println("-------------------------------------------");
            }else {
                System.out.println("登录成功!欢迎使用学生管理系统");
                System.out.println("-------------------------------------------");
                StudentSystem ss = new StudentSystem();
                ss.studentSystem();
            }

        }
    }

    //判断用户名和密码是否正确
    public static boolean checkUserInfo(ArrayList<User> list,User userInfo){
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            //判断用户名和密码
            if (user.getUserName().equals(userInfo.getUserName()) &&
                    user.getPassWord().equals(userInfo.getPassWord())){
                return true;
            }
        }
        return false;
    }

    //生成验证码
    public static String getCode() {
        //用集合存储所有的大小写字母
        ArrayList<Character> charList = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            charList.add((char) ('a' + i));
            charList.add((char) ('A' + i));
        }
        //随机获取4个字母,并拼接起来
        Random r = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int randomIndex = r.nextInt(charList.size());
            sb.append(charList.get(randomIndex));
        }
        //将随机数字添加到末尾
        int randomNum = r.nextInt(10);
        sb.append(randomNum);

        //数字可以出现在任意位置(将字符串转化为数组，然修改数组，再转化字符串)
        char[] chars = sb.toString().toCharArray();
        //获取随机数，与此随机数进行转化
        int randomIndex = r.nextInt(chars.length);
        char tmp = chars[chars.length - 1];
        chars[chars.length - 1] = chars[randomIndex];
        chars[randomIndex] = tmp;

        //转化为字符串并返回
        return new String(chars);
    }

    //注册
    public static void register(ArrayList<User> list) {
        User user = new User();
        Scanner sc = new Scanner(System.in);
        //1、用户名需要满足以下要求：
        while (true) {
            System.out.println("请输入需要创建的用户名:");
            String username = sc.next();
            //先验证格式是否正确，在验证是否唯一
            //因为在以后所有的数据是存在数据库中，如果我们要校验，需要使用到网络资源
            boolean flag1 = checkUsername(username);
            if (!flag1) {
                System.out.println("用户名格式不正确，请重新输入!");
                continue;
            }
            //校验用户名唯一
            boolean flag2 = contains(list, username);
            if (flag2) {//存在->抛出
                System.out.println("用户存在，请重新输入!");
            } else {//不存在->username符合要求!
                user.setUserName(username);
                break;
            }

        }
        //2、密码键盘输入两次，两次一致才可以进行注册。
        while (true) {
            System.out.println("请输入第一次密码:");
            String password = sc.next();
            System.out.println("请再输入一次密码:");
            String againPassword = sc.next();
            if (!password.equals(againPassword)) {
                System.out.println("两次密码不一致，请重新输入:");
            } else {
                user.setPassWord(password);
                break;
            }
        }
        //3、身份证号码需要验证
        while (true) {
            System.out.println("请输入身份证号码:");
            String personId = sc.next();
            // 验证要求：
            boolean flag3 = checkPersonID(personId);
            if (!flag3) {
                System.out.println("身份证不符合要求，请重新输入!");
            } else {
                user.setPersonId(personId);
                break;
            }
        }
        //4、手机号验证
        while (true) {
            System.out.println("请输入手机号:");
            String phoneNumber = sc.next();
            boolean flag4 = checkPhoneNumber(phoneNumber);
            if (!flag4) {
                System.out.println("手机号不符合要求，请重新输入!");
            } else {
                user.setPhoneNumber(phoneNumber);
                break;
            }
        }
        //将用户添加到list中
        list.add(user);
    }

    //校验手机号
    public static boolean checkPhoneNumber(String phoneNumber) {
        // 长度为11位
        int len = phoneNumber.length();
        if (!(len == 11)) {
            return false;
        }
        //不能以0为开头
        if (phoneNumber.startsWith("0")) {
            return false;
        }
        //必须都是数字
        //可以统计数字的个数，等于13->ture,其他情况->false
        int count = 0;
        for (int i = 0; i < len; i++) {
            char c = phoneNumber.charAt(i);
            if (c >= '0' && c <= '9') {
                count++;
            } else {
                break;
            }
        }
        return count == 11;
    }

    //验证身份证号码
    public static boolean checkPersonID(String personId) {
        //长度为18位
        int len = personId.length();
        if (!(len == 18)) {
            return false;
        }
        //不能以0为开头
        if (personId.startsWith("0")) {
            return false;
        }
        //前17位，必须都是数字
        for (int i = 0; i < len - 1; i++) {
            char c = personId.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        //最为一位可以是数字，也可以是大写X或小写x
        char end = personId.charAt(len - 1);
        if (!((end >= '0' && end <= '9') || end == 'x' || end == 'X')) {
            return false;
        } else {//能运行到这，表示这个身份证号码是符合要求的!
            return true;
        }
    }

    //判断username是否唯一
    public static boolean contains(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            //判断用户名是否存在
            if (user.getUserName().equals(username)) {//存在->true
                return true;
            }
        }
        return false;   //不存在->false
    }

    //判断格式是否正确
    public static boolean checkUsername(String username) {
//        验证要求：

        //用户名长度必须在3~15位之间
        int len = username.length();
        if (len < 3 || len > 15) {//不在3~15之间--返回false
            return false;
        }
        //继续校验 字母加数字的组合，但是不能是纯数字
        //如果有一个字符不是字母或数字，那么就返回false
        for (int i = 0; i < len; i++) {
            //获取其中一个字符
            char c = username.charAt(i);
            if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
                return false;
            }
        }
        //不能是纯数字
        //统计字母的数量,如果大于0则符合要求->ture,小于0->false
        int count = 0;
        for (int i = 0; i < len; i++) {
            //获取其中一个字符
            char c = username.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                count++;
                break;
            }
        }
        return count > 0;

    }


    //忘记密码
    public static void forgetPassword(ArrayList<User> list) {
        // 1，键盘录入用户名，判断当前用户名是否存在，如不存在，直接结束方法，并提示：未注册
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要修改密码的用户名:");
        String username = sc.next();
        boolean result = contains(list,username);
        if (!result){
            System.out.println("用户名未注册!");
            return;
        }
        //2，键盘录入身份证号码和手机号码
        System.out.println("请输入身份证号码:");
        String personId = sc.next();
        System.out.println("请输入手机号码");
        String phoneNumber = sc.next();

        //3，判断当前用户的身份证号码和手机号码是否一致，
        //首先要获取到当前用户的信息
        int userIndex = getIndex(list,username);
        User user = list.get(userIndex);
        if (!(user.getPersonId().equals(personId) && user.getPhoneNumber().equals(phoneNumber))){
            //如果不一致，则提示：
            System.out.println("用户"+username+"账号信息不匹配，修改失败!");
            return;
        }
        //如果一致，则提示输入密码，进行修改。
        while (true){
            System.out.println("请输入密码:");
            String password = sc.next();
            System.out.println("请再次输入密码");
            String againPassword = sc.next();
            if (password.equals(againPassword)){
                System.out.println("修改成功!");
                user.setPassWord(password);
                break;
            } else {
                System.out.println("两次密码不一致,修改失败!\n请重新输入:");
            }
        }
    }
    //获取用户再列表中的索引
    public static int getIndex(ArrayList<User> list,String username){
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (user.getUserName().equals(username)){
                return i;
            }
        }
        return -1;
    }
}
